package cliente.reserva;

import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.text.ParseException;

import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class CadastrarReserva extends AbstractAction {
	private Action executaCadastrarReserva;
	
	private JFrame tfCadastrarReserva;
	private JLabel lIdCliente, lNumApto, lDataIni, lDataFim, lValorEntrada;
	private JTextField tIdCliente, tNumApto;
	private JFormattedTextField tDataIni, tDataFim, tValorEntrada;
	private JButton bInserir, bFechar;
	
	public CadastrarReserva() {
		super("Cadastrar Reserva");
		this.putValue(Action.SHORT_DESCRIPTION, "Cadastra uma reserva no sistema");
		setExecutaCadastrarReserva(new ExecutaCadastrarReserva(this));
	}

	@Override
	/**
	 *  Define o que será executado quando a ação for acionada
	 *  @param event evento recebido
	 */
	public void actionPerformed(ActionEvent event) {
		// Cria um novo frame
		setTfCadastrarReserva(new JFrame("Cadastrar Reserva"));
		// Seta a operação default ao fechar o frame (no caso, é eliminar o frame da memória)
		getTfCadastrarReserva().setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		// Seta o container interno
		Container interno = this.getTfCadastrarReserva().getContentPane();
		// Ajusta o layout do Frame para um GridBagLayout
		GridBagConstraints cons = new GridBagConstraints();
		GridBagLayout layout = new GridBagLayout();
		interno.setLayout(layout);
		// Seta uma borda de 2px entre cada elemento do frame
		cons.insets = new Insets(2,2,2,2);
		
		// Componentes do Frame
		
		// Label do Id do Cliente
		setlIdCliente(new JLabel("CPF do CLiente"));// Novo label
		cons.weightx 	= 0.25; 					// Ocupara 25% da linha
		cons.fill 		= GridBagConstraints.NONE;	// Não será redimensionado
		cons.gridx 		= 0;						// Ficará na coluna 0
		cons.gridy 		= 0;						// Ficará na linha 0
		interno.add(getlIdCliente(), cons);		// Adiciona ao Frame
		
		// Texto do Id do Cliente
		settIdCliente(new JTextField());
		cons.weightx 	= 0.75;
		cons.fill 		= GridBagConstraints.HORIZONTAL;	// Será esticado horizontalmente
		cons.gridx 		= 1;
		cons.gridy 		= 0;
		interno.add(gettIdCliente(), cons);
		
		// Label do Número do Apartamento
		setlNumApto(new JLabel("Nº Apto."));
		cons.weightx 	= 0.25; 					// Ocupara 25% da linha
		cons.fill 		= GridBagConstraints.NONE;	// Não será redimensionado
		cons.gridx 		= 0;						// Ficará na coluna 0
		cons.gridy 		= 1;						// Ficará na linha 0
		interno.add(getlNumApto(), cons);
		
		// Texto do Número do Apartamento
		settNumApto(new JTextField());
		cons.weightx 	= 0.75; 					
		cons.fill 		= GridBagConstraints.HORIZONTAL;
		cons.gridx 		= 1;						
		cons.gridy 		= 1;						
		interno.add(gettNumApto(), cons);
		
		// Label da data de início
		setlDataIni(new JLabel("Data de início"));	
		cons.weightx 	= 0.25; 						
		cons.fill 		= GridBagConstraints.NONE;		
		cons.gridx 		= 0;								
		cons.gridy 		= 2;								
		interno.add(getlDataIni(),cons);			
		
		// Texto da data de início
		settDataIni(new JFormattedTextField());
		cons.weightx 	= 0.25;
		cons.fill 		= GridBagConstraints.HORIZONTAL;	// Será expandido horizontalmente
		cons.gridx 		= 1;
		cons.gridy 		= 2;	
		interno.add(gettDataIni(), cons);
		// Ajusta o formato da data
		try  {  
				formater.MaskFormater.maskData(gettDataIni());  
		} catch (ParseException ex) {  
				JOptionPane.showMessageDialog(getTfCadastrarReserva(),"Data inválida.","Erro",JOptionPane.ERROR_MESSAGE);  
		} 
		
		// Label da data do fim
		setlDataFim(new JLabel("Data de Saída"));
		cons.weightx 	= 0.25; 
		cons.gridx 		= 0;
		cons.gridy 		= 3;
		cons.fill 		= GridBagConstraints.NONE;
		interno.add(getlDataFim(), cons);
		
		// Texto da data de fim
		settDataFim(new JFormattedTextField());
		cons.weightx 	= 0.75;
		cons.gridx 		= 1;
		cons.gridy 		= 3;
		cons.fill 		= GridBagConstraints.HORIZONTAL;
		interno.add(gettDataFim(), cons);
		try  {  
			formater.MaskFormater.maskData(gettDataFim());  
		} catch (ParseException ex) {  
			JOptionPane.showMessageDialog(getTfCadastrarReserva(),"Data inválida.","Erro",JOptionPane.ERROR_MESSAGE);  
		} 
		
		// Label do Valor da Entrada
		setlValorEntrada(new JLabel("Valor da entrada"));
		cons.weightx 	= 0.25;
		cons.gridx 		= 0;
		cons.gridy		= 4;
		cons.fill		= GridBagConstraints.NONE;
		interno.add(getlValorEntrada(), cons);
		
		// Texto do Valor da Entrada
		settValorEntrada(new JFormattedTextField());
		cons.weightx	= 0.75;
		cons.gridx		= 1;
		cons.gridy		= 4;
		cons.fill		= GridBagConstraints.HORIZONTAL;
		interno.add(gettValorEntrada(), cons);
		// Formata o valor para real
		//gettValorEntrada().setFormatterFactory(formater.MaskFormater.maskMoeda());
		
		// Botão Inserir
		setbInserir(new JButton("Inserir"));
		cons.weightx	= 0.5;
		cons.gridx		= 0;
		cons.gridy		= 5;
		cons.fill		= GridBagConstraints.NONE;
		interno.add(getbInserir(), cons);
		getbInserir().setActionCommand("inserir");
		getbInserir().addActionListener(getExecutaCadastrarReserva());
		
		// Botão Fechar
		setbFechar(new JButton("Fechar"));
		cons.weightx	= 0.5;
		cons.gridx		= 1;
		cons.gridy		= 5;
		cons.fill		= GridBagConstraints.NONE;
		interno.add(getbFechar(), cons);
		getbFechar().setActionCommand("fechar");
		getbFechar().addActionListener(getExecutaCadastrarReserva());
		
		tfCadastrarReserva.setSize(300, 200);
		tfCadastrarReserva.setVisible(true);
	}

	public Action getExecutaCadastrarReserva() {
		return executaCadastrarReserva;
	}

	public void setExecutaCadastrarReserva(Action executaCadastrarReserva) {
		this.executaCadastrarReserva = executaCadastrarReserva;
	}

	public JFrame getTfCadastrarReserva() {
		return tfCadastrarReserva;
	}

	public void setTfCadastrarReserva(JFrame tfCadastrarReserva) {
		this.tfCadastrarReserva = tfCadastrarReserva;
	}

	public JLabel getlIdCliente() {
		return lIdCliente;
	}

	public void setlIdCliente(JLabel lNomeCliente) {
		this.lIdCliente = lNomeCliente;
	}

	public JLabel getlNumApto() {
		return lNumApto;
	}

	public void setlNumApto(JLabel lNumApto) {
		this.lNumApto = lNumApto;
	}

	public JLabel getlDataIni() {
		return lDataIni;
	}

	public void setlDataIni(JLabel lDataIni) {
		this.lDataIni = lDataIni;
	}

	public JLabel getlDataFim() {
		return lDataFim;
	}

	public void setlDataFim(JLabel lDataFim) {
		this.lDataFim = lDataFim;
	}

	public JLabel getlValorEntrada() {
		return lValorEntrada;
	}

	public void setlValorEntrada(JLabel lValorEntrada) {
		this.lValorEntrada = lValorEntrada;
	}

	public JTextField gettIdCliente() {
		return tIdCliente;
	}

	public void settIdCliente(JTextField tNomeCliente) {
		this.tIdCliente = tNomeCliente;
	}

	public JTextField gettNumApto() {
		return tNumApto;
	}

	public void settNumApto(JTextField tNumApto) {
		this.tNumApto = tNumApto;
	}

	public JFormattedTextField gettDataIni() {
		return tDataIni;
	}

	public void settDataIni(JFormattedTextField jTextField) {
		this.tDataIni = jTextField;
	}

	public JFormattedTextField gettDataFim() {
		return tDataFim;
	}

	public void settDataFim(JFormattedTextField tDataFim) {
		this.tDataFim = tDataFim;
	}

	public JFormattedTextField gettValorEntrada() {
		return tValorEntrada;
	}

	public void settValorEntrada(JFormattedTextField tValorEntrada) {
		this.tValorEntrada = tValorEntrada;
	}

	public JButton getbInserir() {
		return bInserir;
	}

	public void setbInserir(JButton bInserir) {
		this.bInserir = bInserir;
	}

	public JButton getbFechar() {
		return bFechar;
	}

	public void setbFechar(JButton bFechar) {
		this.bFechar = bFechar;
	}

}
